package com.admin_system.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 文件存储配置类
 * 负责配置和初始化物料文件的存储环境
 * 在应用启动时自动创建必要的目录结构，确保文件上传功能正常运行
 */
@Configuration
public class FileStorageConfig {

    /** 日志记录器 */
    private static final Logger logger = LoggerFactory.getLogger(FileStorageConfig.class);

    /**
     * 文件上传目录路径
     * 从配置文件中读取，默认为./uploads/materials
     */
    @Value("${file.upload-dir:./uploads/materials}")
    private String uploadDir;
    
    /**
     * 是否确保目录存在的标志
     * 从配置文件中读取，默认为true
     */
    @Value("${file.ensure-dir-exists:true}")
    private boolean ensureDirExists;

    /**
     * 初始化文件存储环境
     * 在应用启动时执行，确保上传目录存在且具有正确的权限
     *
     * @return CommandLineRunner 在Spring Boot启动过程中执行的任务
     */
    @Bean
    public CommandLineRunner initializeFileStorage() {
        return args -> {
            if (ensureDirExists) {
                createDirectoryIfNotExists();
            }
        };
    }
    
    /**
     * 创建上传目录（如果不存在）
     * 检查目录是否存在，不存在则创建
     * 同时验证目录的写入权限，确保可以正常上传文件
     */
    private void createDirectoryIfNotExists() {
        try {
            // 转换配置的路径字符串为Path对象
            Path path = Paths.get(uploadDir);
            
            // 检查目录是否存在，不存在则创建
            if (!Files.exists(path)) {
                logger.info("创建上传目录: {}", path.toAbsolutePath());
                Files.createDirectories(path);
            } else {
                logger.info("上传目录已存在: {}", path.toAbsolutePath());
                
                // 确保目录有写入权限
                File dir = path.toFile();
                if (!dir.canWrite()) {
                    logger.warn("上传目录没有写入权限: {}", path.toAbsolutePath());
                }
            }
        } catch (Exception e) {
            // 记录创建目录过程中的任何错误
            logger.error("创建上传目录失败: {}", e.getMessage(), e);
        }
    }
} 